package 单例模式.懒汉式;

/**
 * 懒汉式单例
 * 支持延时加载，只有调用getInstance方法时才创建实例
 */
public class Single {

    // 构造私有方法
//    private Single(){
//
//    }

    //--------------------------------------------
    /*
    首先检查类变量single是否为空；
    若为空，则新建一个Single实例并赋值给single；
    最后返回single实例。简而言之，确保任何时候都只返回同一个Single实例。
     */
    // 会出现线程安全问题
//    private static Single single;
//    public static Single getInstance(){
//        if(single == null){
//            single = new Single();
//        }
//        return single;
//    }

    //--------------------------------------------
    /*
     * 这种方法通过两次检查 single 是否为 null 来避免不必要的同步操作，
     * 提高了效率。同时使用了 volatile 关键字来确保多线程环境下的正确性。
     */
    //双重检查锁定 + volatile
//    private volatile static Single single;
//    public static Single getInstance() {
//        if (single == null) { // 第一次检查
//            synchronized (Single.class) {
//                if (single == null) { // 第二次检查
//                    single = new Single(); // 创建实例
//                }
//            }
//        }
//        return single;
//    }

    //--------------------------------------------
    /**
     * 静态内部类方式：这种方式利用了 Java 的类加载机制来保证单例的唯一性。
     * 当 SingletonHolder 类被加载时，INSTANCE 将被初始化，
     * 并且这个过程是线程安全的
     */
    // 利用静态内部类实现懒加载
    private Single(){
        // 防止反射创建多个实例
        if (SingletonHolder.INSTANCE != null){
            throw new RuntimeException("不允许创建多个实例");
        }
    }
    private static class SingletonHolder {
        private static final Single INSTANCE = new Single();
    }

    public static Single getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // 防止序列化
    private Object readResolve() {
        return SingletonHolder.INSTANCE;
    }

}
